package com.zoe.onelink.logging.trace.util;

import ch.qos.logback.classic.pattern.TargetLengthBasedClassNameAbbreviator;
import cn.hutool.core.text.StrFormatter;
import com.zoe.onelink.common.constant.TraceSpanConstant;
import com.zoe.onelink.logging.trace.property.TraceLogProperties;
import com.zoe.onelink.util.StrUtil;

/**
 * <p>标题: </p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2021</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: ruansheng
 * @date: 2021-08-26
 */
public class TraceLogUtil {

    private static final TargetLengthBasedClassNameAbbreviator ABBREVIATOR = new TargetLengthBasedClassNameAbbreviator(40);

    /**
     * 简化包名
     * 假设限定长度为40: com.zoe.onelink.business.dao.ParamDao.getCustomParam 转化为 c.z.o.b.dao.ParamDao.getCustomParam
     */
    public static String abbreviator(String text) {
        return StrUtil.isBlank(text) ? "" : ABBREVIATOR.abbreviate(text);
    }

    /**
     * 修剪日志长度
     *
     * @param logText   日志文本
     * @param trimType  修剪类型 {@link TraceLogProperties.TrimType}
     * @param maxLength 日志最大长度
     * @return 修剪后的日志长度
     */
    public static String trim(String logText, String trimType, int maxLength) {

        // 如果日志为空或者日志长度小于设定值
        if (logText == null || maxLength <= 0 || logText.length() <= maxLength) {
            return logText;
        }

        // 取设定值的长度
        if (TraceLogProperties.TrimType.SUB.equals(trimType)) {
            return logText.substring(0, maxLength);
            // 丢弃当前日志
        } else if (TraceLogProperties.TrimType.DISCARD.equals(trimType)) {
            return TraceSpanConstant.Message.PARAM_LENGTH_OVER_LIMIT + maxLength;
        }

        // 未知的修剪类型
        return StrFormatter.format("{} 未知的日志截断策略 [{}]", TraceSpanConstant.Message.PARAM_LENGTH_OVER_LIMIT, trimType);
    }

}
